//#pragma once

#ifndef __STRING_H__
#define __STRING_H__

#define  _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <assert.h>
using namespace std;

namespace yyp
{
	class string
	{
	public:
		string(const char* s= "")
		{
			assert(s);

			size_t sz = strlen(s);

			_str = new char[sz + 1];
			strcpy(_str, s);
			_size = _capacity = sz;
		}

		string(const string& str)
		{
			string tmp(str._str);

			std::swap(_str, tmp._str);
			std::swap(_size, tmp._size);
			std::swap(_capacity, tmp._capacity);
		}

		string& operator=(const string& str)
		{
			if (this != &str)
			{
				string tmp(str._str);

				std::swap(_str, tmp._str);
				std::swap(_size, tmp._size);
				std::swap(_capacity, tmp._capacity);
			}

			return *this;
		}

		~string()
		{
			delete[] _str;
			_str = nullptr;
			_size = _capacity = 0;
		}

		const char* c_str()const
		{
			return _str;
		}

	private:
		char* _str = nullptr;
		size_t _size = 0;
		size_t _capacity = 0;
	};
}



#endif
